package innerdemo;

/**
 * Created with IntelliJ IEDA.
 * Description:
 * User:86186
 * Date:2022-05-14
 * Time:0:30
 */
/*class OuterClass {
    public int date1 = 1;
    private int date2 = 2;
    public static int date3 = 3;
    *//*
     /* *实例内部类
*1.实例内部类中不能定义静态的成员变量
*  如果定义这个静态成员需要被Final定义:public final static int date6
*2.实例内部类当中不能定义静态的成员方法
*
*3.如何实例化，实例化内部类
*   外部类类名.内部类       变量       = 外部类引用.new 内部类();
*   OuterClass.InnerClass innerClass = out.new InnerClass();
*4.如何访问实例内部类和外部类同名的变量
* 外部类类目.this.变量
* 实例内部类当中包含了外部类的this
*
*5.如果是同名的静态的：通过外部类类目去拿到*//*


    class InnerClass {
        public int date1 = 11111;
        public int date3 = 333333;
        public int date5 = 5;
        //public static int date6 = 6;error

        public InnerClass() {
            System.out.println("实例内部类的构造方法！");
        }

        public void innerFunc() {
            System.out.println(date1);
            System.out.println("外部类:"+OuterClass.this.date1);
            System.out.println(date2);
            System.out.println(date3);
            System.out.println("外部类:" + OuterClass.date3);
            System.out.println(date5);

        }
    }
    public void func2() {
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.date1);
    }
}

public class Test {

    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        //先要有外部类的对象，通过外部类的对象来调用
        OuterClass.InnerClass innerClass = out.new InnerClass();
        innerClass.innerFunc();
    }
}*/


    class OuterClass{
        public int date1 = 1;
        private int date2 = 2;
        public static int date3 = 3;

       /*  *静态内部类
         * 1.如何拿到所对应的静态内部类的对象呢？
         * 外部类.内部类            变量       = new 外部类.内部类()
         * OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
         * 2.不能再内部类当中直接访问外部类非静态的数据成员*/

        static class InnerClass{//不依赖于外部类对象
            public int date4 = 4;
            private int date5 = 5;
            public static int date6 = 6;
            private OuterClass outerClass;//2-->

            public InnerClass(OuterClass outerClass){//2-->在这里作为参数后在在上面提供一个OuterClass outerClass成员
                System.out.println("静态内部类的构造方法！");
                this.outerClass = outerClass;
            }
            public void test(){
                //无法总结调用外部类对象
                //System.out.println(date1);   error
                //1-->new一个外部类对象，再调用外部类成员;OuterClass outerClass = new OuterClass();

                //只要给一个外部类引用就可以了
                System.out.println(outerClass.date1);
                System.out.println(outerClass.date2);

                System.out.println(date3);
                System.out.println(date4);
                System.out.println(date5);
                System.out.println(date6);

                System.out.println("test方法执行了！");
            }
        }
    }



    public class Test {
        public static void main(String[] args) {
            OuterClass.InnerClass innerClass = new OuterClass.InnerClass(new OuterClass());
            innerClass.test();
        }
    }


